package com.stt.videoprocess.design.state.impl;

import com.stt.videoprocess.design.model.ProcessingStatus;
import com.stt.videoprocess.design.model.VideoTask;
import com.stt.videoprocess.design.state.VideoProcessingState;
import lombok.extern.slf4j.Slf4j;

/**
 * 初始化状态类，表示视频任务的初始状态
 * 该状态主要负责从初始化状态转换到其他状态
 */
@Slf4j
public class InitState implements VideoProcessingState  {

    /**
     * 处理初始化状态的方法
     * 目前该方法暂无逻辑处理，预留扩展
     * @param task 视频任务对象
     */
    @Override
    public void handle(VideoTask task) {
        // 处理初始化状态的逻辑
        log.info("初始化状态处理中......");
    }

    /**
     * 从初始化状态开始处理视频任务
     * 更新任务状态为处理中，并返回处理中状态对象
     * @param task 视频任务对象
     * @return 返回处理中状态对象
     */
    @Override
    public VideoProcessingState startProcessing(VideoTask task) {
        task.setStatus(ProcessingStatus.PROCESSING);
        task.setUpdateTime(java.time.LocalDateTime.now());
        return new ProcessingState();
    }

    /**
     * 尝试从初始化状态暂停处理视频任务
     * 抛出非法状态异常，因为不允许从初始化状态直接变为暂停状态
     * @param task 视频任务对象
     * @return 无返回值，因为抛出异常
     */
    @Override
    public VideoProcessingState pauseProcessing(VideoTask task) {
        throw new IllegalStateException("不能从初始化状态变为暂停状态");
    }

    /**
     * 尝试从初始化状态恢复处理视频任务
     * 抛出非法状态异常，因为不允许从初始化状态直接变为恢复执行状态
     * @param task 视频任务对象
     * @return 无返回值，因为抛出异常
     */
    @Override
    public VideoProcessingState resumeProcessing(VideoTask task) {
        throw new IllegalStateException("不能从初始化状态变为恢复执行状态");
    }

    /**
     * 尝试从初始化状态完成视频任务处理
     * 抛出非法状态异常，因为不允许从初始化状态直接变为完成状态
     * @param task 视频任务对象
     * @return 无返回值，因为抛出异常
     */
    @Override
    public VideoProcessingState completeProcessing(VideoTask task) {
        throw new IllegalStateException("不能从初始化状态变为完成状态");
    }

    /**
     * 从初始化状态处理视频任务失败
     * 更新任务状态为失败，并记录错误信息，返回失败状态对象
     * @param task 视频任务对象
     * @param errorMessage 错误信息
     * @return 返回失败状态对象
     */
    @Override
    public VideoProcessingState failProcessing(VideoTask task, String errorMessage) {
        task.setStatus(ProcessingStatus.FAILED);
        task.setErrorMessage(errorMessage);
        task.setUpdateTime(java.time.LocalDateTime.now());
        return new FailedState();
    }
}
